// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Author: wsfuyibing <682805@qq.com>
// Date: 2024-07-24

package middlewares

import (
	"context"
	"gitee.com/go-libs/log"
	"github.com/kataras/iris/v12"
	"net/http"
)

// Catch
// Catches a runtime panic on each http request.
func Catch(i iris.Context) {
	// Execute
	// when middleware done.
	defer func() {
		var (
			ctx context.Context
			r   any
		)

		// Do nothing
		// if no panic occurred.
		if r = recover(); r == nil {
			return
		}

		// Logger
		// fatal message.
		if span, ok := i.Values().Get(TracingSpan).(log.Span); ok {
			ctx = span.GetContext()
		}
		log.Fatalfc(ctx, `request process panic: fatal="%v"`, r)

		// Return
		// if context stopped.
		if i.IsStopped() {
			return
		}

		// Reset
		// status code and render error.
		i.StatusCode(http.StatusInternalServerError)

		// Render
		// error response.
		Error(i)
	}()

	// Call
	// next middleware.
	i.Next()
}
